package domain;

import java.io.Serializable;
import javax.persistence.*;

import ui.graphical.UIHelper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Set;


/**
 * The persistent class for the reservering database table.
 * 
 */
@Entity
@Table(name="reservering")
@NamedQueries({
    @NamedQuery(name = "Reservering.findByPlanningId", query = "SELECT r FROM Reservering r WHERE r.planning.planningId = :planning_id"),
    @NamedQuery(name = "Reservering.findAll", query = "SELECT r FROM Reservering r"),
    @NamedQuery(name = "Reservering.findByName", query = "SELECT r FROM Reservering r WHERE r.geboekt_door.achternaam LIKE :naam OR r.geboekt_door.voornaam LIKE :naam"),
    @NamedQuery(name = "Reservering.findByReserveringId", query = "SELECT r FROM Reservering r WHERE r.reserveringId = :reservering_id")})
public class Reservering implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="reservering_id", unique=true, nullable=false)
	private int reserveringId;

	@Column(name="aantal_verlengings_dagen")
	private int aantalVerlengingsDagen;

	@Column(nullable=false)
	private int aantaldeelnemers;

	@Column(nullable=false)
	private byte betaald;

    @Temporal( TemporalType.DATE)
	private Date betaaldatum;

    @Temporal( TemporalType.DATE)
	@Column(nullable=false)
	private Date boekingsdatum;

    @Temporal( TemporalType.DATE)
	private Date canceldatum;

	@Column(nullable=false, precision=10, scale=2)
	private BigDecimal prijs;

	@Column(nullable=false)
	private byte vluchtverlenging;

	@Column(name="vluchtverlengings_kosten", precision=10, scale=2)
	private BigDecimal vluchtverlengingsKosten;

	//bi-directional many-to-one association to Deelnemer
	@OneToMany(mappedBy="reservering", fetch=FetchType.EAGER)
	private Set<Deelnemer> deelnemers;

	//uni-directional many-to-one association to Persoon
    @ManyToOne
	@JoinColumn(name="geboekt_voor", nullable=false)
	private Persoon geboekt_voor;

	//bi-directional many-to-one association to Planning
    @ManyToOne
	@JoinColumn(name="planning_id", nullable=false)
	private Planning planning;

	//uni-directional many-to-one association to Persoon
    @ManyToOne
	@JoinColumn(name="geboekt_door", nullable=false)
	private Persoon geboekt_door;

    public Reservering() {
    }

	public int getReserveringId() {
		return this.reserveringId;
	}

	public void setReserveringId(int reserveringId) {
		this.reserveringId = reserveringId;
	}

	public int getAantalVerlengingsDagen() {
		return this.aantalVerlengingsDagen;
	}

	public void setAantalVerlengingsDagen(int aantalVerlengingsDagen) {
		this.aantalVerlengingsDagen = aantalVerlengingsDagen;
	}

	public int getAantaldeelnemers() {
		return this.aantaldeelnemers;
	}

	private void setAantaldeelnemers(int aantaldeelnemers) {
		this.aantaldeelnemers = aantaldeelnemers;
	}

	public byte getBetaald() {
		return this.betaald;
	}

	public void setBetaald(byte betaald) {
		this.betaald = betaald;
	}

	public Date getBetaaldatum() {
		return this.betaaldatum;
	}

	public void setBetaaldatum(Date betaaldatum) {
		this.betaaldatum = betaaldatum;
	}

	public Date getBoekingsdatum() {
		return this.boekingsdatum;
	}

	public void setBoekingsdatum(Date boekingsdatum) {
		this.boekingsdatum = boekingsdatum;
	}

	public Date getCanceldatum() {
		return this.canceldatum;
	}

	public void setCanceldatum(Date canceldatum) {
		this.canceldatum = canceldatum;
	}

	public BigDecimal getPrijs() {
		return this.prijs;
	}

	public void setPrijs(BigDecimal prijs) {
		this.prijs = prijs;
	}

	public byte getVluchtverlenging() {
		return this.vluchtverlenging;
	}

	public void setVluchtverlenging(byte vluchtverlenging) {
		this.vluchtverlenging = vluchtverlenging;
	}

	public BigDecimal getVluchtverlengingsKosten() {
		return this.vluchtverlengingsKosten;
	}

	public void setVluchtverlengingsKosten(BigDecimal vluchtverlengingsKosten) {
		this.vluchtverlengingsKosten = vluchtverlengingsKosten;
	}

	public Set<Deelnemer> getDeelnemers() {
		return this.deelnemers;
	}

	public void setDeelnemers(Set<Deelnemer> deelnemers) {
		setAantaldeelnemers(deelnemers.size());
	
		this.deelnemers = deelnemers;
	}
	
	public Persoon getGeboekt_voor() {
		return this.geboekt_voor;
	}

	public void setGeboekt_voor(Persoon geboekt_voor) {
		this.geboekt_voor = geboekt_voor;
	}
	
	public Planning getPlanning() {
		return this.planning;
	}

	public void setPlanning(Planning planning) {
		this.planning = planning;
	}
	
	public Persoon getGeboekt_door() {
		return this.geboekt_door;
	}

	public void setGeboekt_door(Persoon geboekt_door) {
		this.geboekt_door = geboekt_door;
	}
	
	@Override
	public String toString() {
		return UIHelper.date2string(getBoekingsdatum()) + " "+ getGeboekt_door() + " "  +
				" Reisnaam: " + getPlanning().getReis().getReistype() + " Vertrekdatum: " + UIHelper.date2string(getPlanning().getStartdatum()) ;
	}
}